]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
signalTracker: Avoid getting the same owner object proto multiple times
authorMarco Trevisan (Treviño) <mail@3v1n0.net>
Wed, 6 Jul 2022 15:50:57 +0000 (17:50 +0200)
committerMarco Trevisan (Treviño) <mail@3v1n0.net>
Wed, 6 Jul 2022 16:24:12 +0000 (18:24 +0200)
While untracking an object we used to compute it's proto for each signal
we were disconnecting from, while this is not needed when we're just
iterating over all the same owner signals, so let's add few more
functions to compute an object prototype, and repeat the disconnections
in the simplest way we can.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2366>

js/misc/signalTracker.js

index e01bec5b12f235c726a461f2c02f6d724f28f801..9f8a9a70f107110c22f69aca189540c1bb5b0236 100644 (file)
@@ -102,11 +102,18 @@ class SignalTracker {
         signalData.destroyId = obj.connect_after('destroy', () => this.untrack(obj));
     }
 
-    _disconnectSignal(obj, id) {
-        const proto = obj instanceof GObject.Object
+    _disconnectSignalForProto(proto, obj, id) {
+        proto['disconnect'].call(obj, id);
+    }
+
+    _getObjectProto(obj) {
+        return obj instanceof GObject.Object
             ? GObject.Object.prototype
             : Object.getPrototypeOf(obj);
-        proto['disconnect'].call(obj, id);
+    }
+
+    _disconnectSignal(obj, id) {
+        this._disconnectSignalForProto(this._getObjectProto(obj), obj, id);
     }
 
     /**
@@ -129,7 +136,9 @@ class SignalTracker {
         const { ownerSignals, destroyId } = this._getSignalData(obj);
         this._map.delete(obj);
 
-        ownerSignals.forEach(id => this._disconnectSignal(this._owner, id));
+        const ownerProto = this._getObjectProto(this._owner);
+        ownerSignals.forEach(id =>
+            this._disconnectSignalForProto(ownerProto, this._owner, id));
         if (destroyId)
             this._disconnectSignal(obj, destroyId);
     }